4.5 行列ベクトル積和演算
MAUの行列ベクトル積和演算の基本動作(第3.6.9.1節)の詳細について述べる。
一般化のため、第4.4節で述べたブロックフロート形式で、ブロックサイズがn、仮数部長がmであるも
のを仮定する。半精度、疑似単精度、単精度、倍精度のそれぞれでブロックサイズは 16 , 8 , 4 , 4 、仮数部長は
m= 9, 18 , 23 , 52 となる。出力 1 要素に対する積和演算を(∑ni=1aibi) +cと表記し、積の入力ai, biはそれ
ぞれ次で表されるブロックフロート値であるとする:
code:txt
ai= 2e(a)(−1)s(ia)
code:txt
∑m
j=1
code:txt
21 −jAi,j (4.10)
code:txt
bi= 2e(b)(−1)s
(ib)∑m
j=1
code:txt
21 −jBi,j. (4.11)
ここで共通指数e(a), e(b)、符号s(ia), s(ib)∈{ 0 , 1 }、仮数部の各桁Ai,j, Bi,j∈{ 0 , 1 }の表記を用いた。このと
き内積の厳密な値は
code:txt
∑n
i=1
code:txt
aibi= 2e(a)+e(b)+2
code:txt
∑n
i=1
code:txt
(−1)s
(ia)+s(ib)
Pi (4.12)
code:txt
Pi:=
∑
code:txt
1 ≤j,k≤m
code:txt
pi,j,k (4.13)
code:txt
pi,j,k:= 2−(j+k)Ai,jBi,k (4.14)
となる。
拡張表現なしの場合の半精度と疑似単精度においてはPiはこの表式どおりに計算される。単精度と倍精度
においてはベクトル積和演算(第4.3節)と同じく、Piを、一部の部分積を加算せず代わりに補正項を加えた
P′iで置き換える。この補正はベクトル積和演算の単精度と倍精度それぞれの場合と全く同じことをiごとに
行う。すなわち、単精度では入力の仮数部の下位 5 ビット同士、倍精度では下位 16 ビット同士の乗算を省略
し、その結果がゼロになる場合を特別に検出してゼロとし、それ以外の場合は省略された仮数部の最上位にの
み 1 が立っていた場合と同じ結果とする。i方向の加算については途中で丸めなどは入らず、十分な桁数で符
号付き整数加算が行われる。
拡張表現ありの場合の半精度においてはi方向の加算の前に、それぞれのiで、aiとbiの片方だけが拡張
表現となっていれば 6 ビット、両方が拡張表現となっていれば 12 ビット、Piを右シフトして丸める操作が入
る。この操作の厳密な定義は乗算器出力の詳細に立ち入る必要があるため省略する。
内積を計算したあとの手順は、ベクトル積和演算で積を計算したあとと同じである。これはcの精度拡張や
各精度での精度縮減についての注意も含む。
単精度と倍精度における部分積の補正項への置き換えが実用上ほとんどの場合に問題にならないと考えられ
るのも、ベクトル積和演算と同様である。